package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	s := "101023"
	// 1.10.2.3
	fmt.Println(restoreIpAddresses(s))
}

/*
*
如何找出当前的字符串or数字: 从初始位置到当前为止截取s，即s[index,i+1]
如何验证数字有效: 不能以0开头 并且 不大于255 则有效
确认什么条件下收集结果: list中有4个有效数字 并且 index走到了末尾，用代码表示是 len(list)==4 && index = len(s)
*/
func restoreIpAddresses(s string) []string {
	var res []string
	var list []string
	var helper func(list []string, index int)
	helper = func(list []string, index int) {
		if index == len(s) && len(list) == 4 {
			res = append(res, strings.Join(list, "."))
			return
		} else if len(list) > 4 {
			return
		}

		for i := index; i < len(s); i++ {
			str := s[index : i+1]
			if len(str) > 1 && str[0] == '0' {
				continue
			}
			num, _ := strconv.Atoi(str)
			if num > 255 {
				continue
			}

			list = append(list, strconv.Itoa(num))
			helper(list, i+1)
			list = list[:len(list)-1]
		}
	}
	helper(list, 0)
	return res
}
